home *** CD-ROM | disk | FTP | other *** search
/ The World of Computer Software / The World of Computer Software.iso / vcrp11.zip / VCRPLUS.SH < prev   
Text File  |  1993-01-22  |  35KB  |  1,680 lines

  1. In article <1992Dec31.170245.6522@eecs.nwu.edu> kaufman@eecs.nwu.edu (Michael L. Kaufman) writes:
  2. >This file would not decode on my machine.
  3.  
  4. I had problems with it too.  I had to fix up the uuencoded text
  5. manually, since the trailing spaces got deleted somewhere along the
  6. way.  Even then, uudecode claimed 'short file', but I was able to
  7. unpack the resulting .zip file without problems.
  8.  
  9. >Mail to the poster bounced, so if he (or anyone else)
  10. >could try reposting, or better yet, just post the source, I
  11. >would appreciate it. I am sure that others would too.
  12.  
  13. Okay, here's a shar of the contents of the .zip file.  Note that I
  14. am NOT the author and I have not been able to contact him by Email
  15. either.
  16.  
  17. DaviD W. Sanderson (dws@ssec.wisc.edu)
  18.  
  19.     "The Noah Webster of smileys is David Sanderson"
  20.         - The Wall Street Journal, 15 Sep 1992
  21.  
  22. #!/bin/sh
  23. # This is a shell archive (produced by shar 3.49)
  24. # To extract the files from this archive, save it to a file, remove
  25. # everything above the "!/bin/sh" line above, and type "sh file_name".
  26. #
  27. # made 12/31/1992 18:00 UTC by dws@ssec
  28. # Source directory /home/dws/vcrplus
  29. #
  30. # existing files will NOT be overwritten unless -c is specified
  31. #
  32. # This shar contains:
  33. # length  mode       name
  34. # ------ ---------- ------------------------------------------
  35. #   2641 -r-------- readme.txt
  36. #  13721 -r-------- decode.c
  37. #  14248 -r-------- encode.c
  38. #
  39. # ============= readme.txt ==============
  40. if test -f 'readme.txt' -a X"$1" != X"-c"; then
  41.     echo 'x - skipping readme.txt (File already exists)'
  42. else
  43. echo 'x - extracting readme.txt (Text)'
  44. sed 's/^X//' << 'SHAR_EOF' > 'readme.txt' &&
  45. This ZIP archive holds three files
  46. X      readme.txt
  47. X      encode.c
  48. X      decode.c
  49. X
  50. X
  51. decode.c is source program that reads a VCRPLUS code
  52. number value you find in the newspaper and calculates
  53. X    date_of_the_tv_program
  54. X    starting_time_of_the_tv_program
  55. X    run_length_of_the_tv_program
  56. X
  57. X
  58. encode.c is source program that reads a date, start time,
  59. and run length then turns them into a VCRPLUS code number
  60. like the ones in the newspaper.
  61. X
  62. X
  63. X
  64. There are a few weak spots in these programs.
  65. X
  66. X    1.  They only work for the usual kinds of tv shows,
  67. X           a.  Must start on an even half-hour or hour
  68. X           b.  Must end on an even half-hour or hour
  69. X
  70. X    2.  They only handle VCRPLUS code values that are 1-6 digits
  71. X           long (these are the ones that start and end on
  72. X           half-hour or hour boundaries)
  73. X
  74. X    3.  Both programs ask for today's date.  They should
  75. X           instead get this from the computer itself but that is
  76. X           too much involved with O/S details.
  77. X
  78. X    4.  Integers are used everywhere, even for time_of_day.
  79. X           a.  You need to use a 32-bit computer
  80. X           b.  So, nine o clock at night, comes out 2100
  81. X
  82. X    5.  The VCRPLUS hardware uses "channel mapping" for
  83. X           channel numbers above 19, and for cable tv stations.
  84. X           Just decode some VCRPLUS code numbers from each unusual
  85. X           channel and get the "mapped channel" numbers.  For
  86. X           example in this area the VCRPLUS people have
  87. X           mapped cable station ESPN to "channel 22".
  88. X
  89. X
  90. X
  91. X
  92. X
  93. Example 1:  encode    nebraska  deleware  newyork
  94. X                 This is a (deliberate) error.  You should
  95. X                 get back a message telling how to do it right:
  96. X            Usage: encode  month  day  year  channel  starting_time  length_in_minutes
  97. X
  98. X
  99. X
  100. Example 2:  decode    newyork  nebraska  deleware
  101. X            Usage: decode  todays_month  todays_day  todays_year   Code_value_in_newspaper
  102. X
  103. X
  104. X
  105. Example 3:  encode 1 4 93 5 900 30
  106. X                 You have asked for the VCRPLUS code of a tv show
  107. X                 on January 4th of 1993, channel number 5, at 9 o clock
  108. X                 (in the morning), that lasts for 30 minutes.
  109. X                 The program answers back:
  110. X                  1   4  93   5  900    30    VCRPLUS_CODE=    19297
  111. X
  112. X
  113. Example 4:  decode 1 2 93 19297
  114. X                 On January 2nd of 1993 you have asked a question.  You
  115. X                 want to know "what show does the VCRPLUS code 19297
  116. X                 represent?"  The program answers back
  117. X                 Code=  19297     1   4  93   Mapped_channel=  5  Start_time= 0900  Length=  30
  118. X
  119. X
  120. X
  121. X
  122. X
  123. Have some fun with this stuff.
  124. X
  125. Otis.
  126. SHAR_EOF
  127. chmod 0400 readme.txt ||
  128. echo 'restore of readme.txt failed'
  129. Wc_c="`wc -c < 'readme.txt'`"
  130. test 2641 -eq "$Wc_c" ||
  131.     echo 'readme.txt: original size 2641, current size' "$Wc_c"
  132. fi
  133. # ============= decode.c ==============
  134. if test -f 'decode.c' -a X"$1" != X"-c"; then
  135.     echo 'x - skipping decode.c (File already exists)'
  136. else
  137. echo 'x - extracting decode.c (Text)'
  138. sed 's/^X//' << 'SHAR_EOF' > 'decode.c' &&
  139. #include <stdio.h>
  140. X
  141. #define        KEY001    (68150631)
  142. #define        INVALID    (-987)
  143. X
  144. X
  145. /* function that performs initial scrambling */
  146. int    mixup(x, y)
  147. X    int    x, y;
  148. {
  149. X    int    i, j, k, sum;
  150. X
  151. X    int    a[12], b[12], out[12] ;
  152. X
  153. X    /* get the digits of x into a[] */
  154. X    j = x ;
  155. X    for(i=0; i<9; i++)
  156. X    {
  157. X        k = j % 10;
  158. X        a[i] = k;
  159. X        j = (j - k) / 10 ;
  160. X    }
  161. X
  162. X    /* get the digits of y into b[] */
  163. X    j = y ;
  164. X    for(i=0; i<9; i++)
  165. X    {
  166. X        k = j % 10;
  167. X        b[i] = k;
  168. X        j = (j - k) / 10 ;
  169. X        out[i] = 0;
  170. X    }
  171. X
  172. X
  173. X    for(i=0; i<=8; i++)
  174. X    {
  175. X        for(j=0; j<=8; j++)
  176. X        {
  177. X            out[i+j] += (b[j] * a[i]) ;
  178. X        }
  179. X    }
  180. X
  181. X    j = 1;
  182. X    sum = 0;
  183. X    for(i=0; i<=8; i++)
  184. X    {
  185. X        sum += j * (out[i] % 10);
  186. X        j = j * 10 ;
  187. X    }
  188. X    return( sum ) ;
  189. }
  190. X
  191. X
  192. X
  193. /* first function */
  194. int    f1(inval)
  195. X    int    inval ;
  196. {
  197. X    int    ndigits, hashval ;
  198. X    int    pwr ;
  199. X
  200. X
  201. X    ndigits = 0;
  202. X    pwr = 1;
  203. X    while(inval >= pwr) { ndigits++; pwr *= 10; }
  204. X    if(ndigits > 8) printf("\nPANIC: %d has %d digits\n", inval, ndigits);
  205. X    pwr = pwr / 10 ;
  206. X
  207. X    hashval = inval;
  208. again:    hashval = mixup(hashval, KEY001) % (pwr * 10) ;
  209. X    if(hashval < pwr) goto again ;
  210. X
  211. X    return(hashval);
  212. }
  213. X
  214. X
  215. X
  216. X
  217. /* the 512-entry tables of starting time and pgm duration */
  218. void    lookup(i, outtime, outdur)
  219. X    int    i, *outtime, *outdur ;
  220. {
  221. X    static    int    start[480], leng[480] ;
  222. X    static    int    initializer = 0;
  223. X
  224. X    int    j, s;
  225. X
  226. X    if(initializer == 0) {
  227. X    initializer = 1;
  228. X
  229. X    for(j=0; j<512; j++) { start[j] = leng[j] = INVALID; }
  230. X
  231. X    leng[0]   =  30 ;
  232. X    leng[100] = 120 ;
  233. X    leng[101] =  90 ;
  234. X    leng[102] = 120 ;
  235. X    leng[103] = 120 ;
  236. X    leng[104] =  90 ;
  237. X    leng[105] =  90 ;
  238. X    leng[106] =  30 ;
  239. X    leng[107] =  30 ;
  240. X    leng[108] = 120 ;
  241. X    leng[109] =  90 ;
  242. X    leng[10]  =  30 ;
  243. X    leng[110] =  90 ;
  244. X    leng[111] =  30 ;
  245. X    leng[112] =  90 ;
  246. X    leng[113] =  30 ;
  247. X    leng[114] =  30 ;
  248. X    leng[115] = 120 ;
  249. X    leng[116] =  30 ;
  250. X    leng[117] = 120 ;
  251. X    leng[118] = 120 ;
  252. X    leng[119] =  30 ;
  253. X    leng[11]  =  30 ;
  254. X    leng[120] =  90 ;
  255. X    leng[121] =  60 ;
  256. X    leng[122] =  60 ;
  257. X    leng[123] =  60 ;
  258. X    leng[124] = 120 ;
  259. X    leng[125] =  90 ;
  260. X    leng[126] =  60 ;
  261. X    leng[127] =  60 ;
  262. X    leng[128] =  90 ;
  263. X    leng[129] = 120 ;
  264. X    leng[12]  =  30 ;
  265. X    leng[130] = 120 ;
  266. X    leng[131] =  90 ;
  267. X    leng[132] =  60 ;
  268. X    leng[133] =  60 ;
  269. X    leng[134] = 120 ;
  270. X    leng[135] =  90 ;
  271. X    leng[136] =  90 ;
  272. X    leng[137] = 120 ;
  273. X    leng[138] = 120 ;
  274. X    leng[139] =  60 ;
  275. X    leng[13]  = 120 ;
  276. X    leng[140] =  60 ;
  277. X    leng[141] =  90 ;
  278. X    leng[142] =  90 ;
  279. X    leng[143] = 120 ;
  280. X    leng[144] =  90 ;
  281. X    leng[145] = 120 ;
  282. X    leng[146] =  90 ;
  283. X    leng[147] = 120 ;
  284. X    leng[148] = 120 ;
  285. X    leng[149] =  90 ;
  286. X    leng[14]  =  30 ;
  287. X    leng[150] = 120 ;
  288. X    leng[151] =  90 ;
  289. X    leng[152] =  90 ;
  290. X    leng[153] =  90 ;
  291. X    leng[154] =  60 ;
  292. X    leng[155] =  60 ;
  293. X    leng[156] = 120 ;
  294. X    leng[157] =  60 ;
  295. X    leng[158] =  60 ;
  296. X    leng[159] =  60 ;
  297. X    leng[15]  =  30 ;
  298. X    leng[160] = 120 ;
  299. X    leng[161] =  60 ;
  300. X    leng[162] =  90 ;
  301. X    leng[163] =  90 ;
  302. X    leng[164] =  60 ;
  303. X    leng[165] =  90 ;
  304. X    leng[166] =  90 ;
  305. X    leng[167] =  60 ;
  306. X    leng[168] =  90 ;
  307. X    leng[169] = 120 ;
  308. X    leng[16]  = 120 ;
  309. X    leng[170] =  60 ;
  310. X    leng[171] = 120 ;
  311. X    leng[172] =  60 ;
  312. X    leng[173] =  60 ;
  313. X    leng[174] = 120 ;
  314. X    leng[175] =  90 ;
  315. X    leng[176] =  60 ;
  316. X    leng[177] = 120 ;
  317. X    leng[178] =  60 ;
  318. X    leng[179] =  60 ;
  319. X    leng[17]  = 120 ;
  320. X    leng[180] =  60 ;
  321. X    leng[181] =  90 ;
  322. X    leng[182] =  60 ;
  323. X    leng[183] = 120 ;
  324. X    leng[184] =  60 ;
  325. X    leng[185] =  60 ;
  326. X    leng[186] =  90 ;
  327. X    leng[187] =  60 ;
  328. X    leng[188] =  90 ;
  329. X    leng[189] = 120 ;
  330. X    leng[18]  =  60 ;
  331. X    leng[190] =  90 ;
  332. X    leng[191] =  90 ;
  333. X    leng[19]  = 120 ;
  334. X    leng[1]   =  30 ;
  335. X    leng[20]  =  60 ;
  336. X    leng[21]  =  60 ;
  337. X    leng[22]  =  60 ;
  338. X    leng[23]  = 120 ;
  339. X    leng[24]  =  60 ;
  340. X    leng[25]  = 120 ;
  341. X    leng[26]  =  30 ;
  342. X    leng[27]  =  30 ;
  343. X    leng[28]  =  30 ;
  344. X    leng[29]  =  60 ;
  345. X    leng[2]   =  30 ;
  346. X    leng[30]  =  90 ;
  347. X    leng[31]  =  30 ;
  348. X    leng[32]  =  30 ;
  349. X    leng[33]  =  30 ;
  350. X    leng[34]  =  30 ;
  351. X    leng[35]  =  60 ;
  352. X    leng[36]  =  30 ;
  353. X    leng[37]  =  60 ;
  354. X    leng[38]  = 120 ;
  355. X    leng[39]  =  60 ;
  356. X    leng[3]   =  30 ;
  357. X    leng[40]  =  30 ;
  358. X    leng[41]  =  30 ;
  359. X    leng[42]  =  30 ;
  360. X    leng[43]  =  30 ;
  361. X    leng[44]  = 120 ;
  362. X    leng[45]  =  30 ;
  363. X    leng[46]  =  30 ;
  364. X    leng[47]  =  30 ;
  365. X    leng[48]  = 120 ;
  366. X    leng[49]  =  30 ;
  367. X    leng[4]   =  30 ;
  368. X    leng[50]  =  60 ;
  369. X    leng[51]  =  60 ;
  370. X    leng[52]  =  30 ;
  371. X    leng[53]  =  30 ;
  372. X    leng[54]  = 120 ;
  373. X    leng[55]  =  60 ;
  374. X    leng[56]  =  60 ;
  375. X    leng[57]  =  30 ;
  376. X    leng[58]  = 120 ;
  377. X    leng[59]  =  30 ;
  378. X    leng[5]   =  30 ;
  379. X    leng[60]  = 120 ;
  380. X    leng[61]  = 120 ;
  381. X    leng[62]  = 120 ;
  382. X    leng[63]  =  30 ;
  383. X    leng[64]  =  90 ;
  384. X    leng[65]  =  30 ;
  385. X    leng[66]  =  30 ;
  386. X    leng[67]  =  30 ;
  387. X    leng[68]  = 120 ;
  388. X    leng[69]  =  90 ;
  389. X    leng[6]   =  30 ;
  390. X    leng[70]  =  90 ;
  391. X    leng[71]  =  60 ;
  392. X    leng[72]  =  90 ;
  393. X    leng[73]  =  90 ;
  394. X    leng[74]  =  90 ;
  395. X    leng[75]  =  90 ;
  396. X    leng[76]  =  90 ;
  397. X    leng[77]  =  60 ;
  398. X    leng[78]  =  90 ;
  399. X    leng[79]  =  30 ;
  400. X    leng[7]   =  30 ;
  401. X    leng[80]  = 120 ;
  402. X    leng[81]  =  60 ;
  403. X    leng[82]  =  90 ;
  404. X    leng[83]  = 120 ;
  405. X    leng[84]  =  60 ;
  406. X    leng[85]  =  60 ;
  407. X    leng[86]  = 120 ;
  408. X    leng[87]  =  30 ;
  409. X    leng[88]  =  90 ;
  410. X    leng[89]  = 120 ;
  411. X    leng[8]   =  30 ;
  412. X    leng[90]  = 120 ;
  413. X    leng[91]  =  90 ;
  414. X    leng[92]  =  90 ;
  415. X    leng[93]  =  90 ;
  416. X    leng[94]  =  90 ;
  417. X    leng[95]  = 120 ;
  418. X    leng[96]  =  60 ;
  419. X    leng[97]  = 120 ;
  420. X    leng[98]  =  90 ;
  421. X    leng[99]  =  30 ;
  422. X    leng[9]   =  60 ;
  423. X    start[0]   = 1830 ;
  424. X    start[100] =  330 ;
  425. X    start[101] = 1500 ;
  426. X    start[102] = 1500 ;
  427. X    start[103] = 2300 ;
  428. X    start[104] = 1900 ;
  429. X    start[105] =  800 ;
  430. X    start[106] =  430 ;
  431. X    start[107] =  300 ;
  432. X    start[108] = 1330 ;
  433. X    start[109] = 1000 ;
  434. X    start[10]  = 1400 ;
  435. X    start[110] =  700 ;
  436. X    start[111] =  100 ;
  437. X    start[112] = 2330 ;
  438. X    start[113] =  330 ;
  439. X    start[114] =  200 ;
  440. X    start[115] = 2230 ;
  441. X    start[116] =  400 ;
  442. X    start[117] =  600 ;
  443. X    start[118] =  400 ;
  444. X    start[119] =  230 ;
  445. X    start[11]  = 2030 ;
  446. X    start[120] =  630 ;
  447. X    start[121] =   30 ;
  448. X    start[122] = 2230 ;
  449. X    start[123] =  100 ;
  450. X    start[124] =   30 ;
  451. X    start[125] = 2300 ;
  452. X    start[126] = 1630 ;
  453. X    start[127] =  830 ;
  454. X    start[128] =    0 ;
  455. X    start[129] = 1930 ;
  456. X    start[12]  = 1700 ;
  457. X    start[130] =  930 ;
  458. X    start[131] = 2030 ;
  459. X    start[132] =  500 ;
  460. X    start[133] = 1730 ;
  461. X    start[134] =  200 ;
  462. X    start[135] = 1930 ;
  463. X    start[136] =  930 ;
  464. X    start[137] = 1730 ;
  465. X    start[138] =  630 ;
  466. X    start[139] = 1830 ;
  467. X    start[13]  = 1600 ;
  468. X    start[140] = 1430 ;
  469. X    start[141] = 1130 ;
  470. X    start[142] =   30 ;
  471. X    start[143] =  830 ;
  472. X    start[144] = 1030 ;
  473. X    start[145] = 1430 ;
  474. X    start[146] =  100 ;
  475. X    start[147] =  730 ;
  476. X    start[148] = 2030 ;
  477. X    start[149] =  300 ;
  478. X    start[14]  = 2000 ;
  479. X    start[150] =  300 ;
  480. X    start[151] = 1330 ;
  481. X    start[152] = 1230 ;
  482. X    start[153] =  230 ;
  483. X    start[154] = 2130 ;
  484. X    start[155] = 1130 ;
  485. X    start[156] = 1830 ;
  486. X    start[157] =  630 ;
  487. X    start[158] =  530 ;
  488. X    start[159] =  200 ;
  489. X    start[15]  = 1500 ;
  490. X    start[160] = 1530 ;
  491. X    start[161] =  730 ;
  492. X    start[162] =  600 ;
  493. X    start[163] = 1730 ;
  494. X    start[164] =  400 ;
  495. X    start[165] =  730 ;
  496. X    start[166] =  430 ;
  497. X    start[167] =  430 ;
  498. X    start[168] =  130 ;
  499. X    start[169] = 1230 ;
  500. X    start[16]  = 2000 ;
  501. X    start[170] =  130 ;
  502. X    start[171] =  230 ;
  503. X    start[172] = 1930 ;
  504. X    start[173] =  300 ;
  505. X    start[174] = 1030 ;
  506. X    start[175] =  200 ;
  507. X    start[176] =  330 ;
  508. X    start[177] =  500 ;
  509. X    start[178] =  930 ;
  510. X    start[179] =  230 ;
  511. X    start[17]  = 2100 ;
  512. X    start[180] = 2030 ;
  513. X    start[181] =  400 ;
  514. X    start[182] = 1530 ;
  515. X    start[183] =  430 ;
  516. X    start[184] = 1330 ;
  517. X    start[185] = 1230 ;
  518. X    start[186] =  330 ;
  519. X    start[187] = 1030 ;
  520. X    start[188] =  500 ;
  521. X    start[189] =  530 ;
  522. X    start[18]  = 2000 ;
  523. X    start[190] =  530 ;
  524. X    start[191] = 1100 ;
  525. X    start[19]  = 1800 ;
  526. X    start[1]   = 1600 ;
  527. X    start[20]  = 1900 ;
  528. X    start[21]  = 2200 ;
  529. X    start[22]  = 2100 ;
  530. X    start[23]  = 1400 ;
  531. X    start[24]  = 1500 ;
  532. X    start[25]  = 2200 ;
  533. X    start[26]  = 1130 ;
  534. X    start[27]  = 1100 ;
  535. X    start[28]  = 2300 ;
  536. X    start[29]  = 1600 ;
  537. X    start[2]   = 1930 ;
  538. X    start[30]  = 2100 ;
  539. X    start[31]  = 2100 ;
  540. X    start[32]  = 1230 ;
  541. X    start[33]  = 1330 ;
  542. X    start[34]  =  930 ;
  543. X    start[35]  = 1300 ;
  544. X    start[36]  = 2130 ;
  545. X    start[37]  = 1200 ;
  546. X    start[38]  = 1000 ;
  547. X    start[39]  = 1800 ;
  548. X    start[3]   = 1630 ;
  549. X    start[40]  = 2200 ;
  550. X    start[41]  = 1200 ;
  551. X    start[42]  =  800 ;
  552. X    start[43]  =  830 ;
  553. X    start[44]  = 1700 ;
  554. X    start[45]  =  900 ;
  555. X    start[46]  = 2230 ;
  556. X    start[47]  = 1030 ;
  557. X    start[48]  = 1900 ;
  558. X    start[49]  =  730 ;
  559. X    start[4]   = 1530 ;
  560. X    start[50]  = 2300 ;
  561. X    start[51]  = 1000 ;
  562. X    start[52]  =  700 ;
  563. X    start[53]  = 1300 ;
  564. X    start[54]  =  700 ;
  565. X    start[55]  = 1100 ;
  566. X    start[56]  = 1400 ;
  567. X    start[57]  = 1000 ;
  568. X    start[58]  =  800 ;
  569. X    start[59]  = 2330 ;
  570. X    start[5]   = 1730 ;
  571. X    start[60]  = 1300 ;
  572. X    start[61]  = 1200 ;
  573. X    start[62]  =  900 ;
  574. X    start[63]  =  630 ;
  575. X    start[64]  = 1800 ;
  576. X    start[65]  =  600 ;
  577. X    start[66]  =  530 ;
  578. X    start[67]  =    0 ;
  579. X    start[68]  = 2330 ;
  580. X    start[69]  = 2200 ;
  581. X    start[6]   = 1800 ;
  582. X    start[70]  = 1300 ;
  583. X    start[71]  =  900 ;
  584. X    start[72]  = 1630 ;
  585. X    start[73]  = 1600 ;
  586. X    start[74]  = 1430 ;
  587. X    start[75]  = 2000 ;
  588. X    start[76]  = 1830 ;
  589. X    start[77]  =  600 ;
  590. X    start[78]  = 1200 ;
  591. X    start[79]  =   30 ;
  592. X    start[7]   = 1430 ;
  593. X    start[80]  =  130 ;
  594. X    start[81]  =    0 ;
  595. X    start[82]  = 1700 ;
  596. X    start[83]  =    0 ;
  597. X    start[84]  =  800 ;
  598. X    start[85]  =  700 ;
  599. X    start[86]  = 2130 ;
  600. X    start[87]  =  500 ;
  601. X    start[88]  = 1530 ;
  602. X    start[89]  = 1130 ;
  603. X    start[8]   = 1900 ;
  604. X    start[90]  = 1100 ;
  605. X    start[91]  =  830 ;
  606. X    start[92]  = 2230 ;
  607. X    start[93]  =  900 ;
  608. X    start[94]  = 2130 ;
  609. X    start[95]  = 1630 ;
  610. X    start[96]  = 2330 ;
  611. X    start[97]  =  100 ;
  612. X    start[98]  = 1400 ;
  613. X    start[99]  =  130 ;
  614. X    start[9]   = 1700 ;
  615. X
  616. X
  617. X    s = 2330;
  618. X    for(j=192; j<240; j++)
  619. X    { start[j] = s; leng[j] = 150; if(0==(j%2)) s-=30; else s-=70; }
  620. X
  621. X    s = 2330;
  622. X    for(j=240; j<288; j++)
  623. X    { start[j] = s; leng[j] = 180; if(0==(j%2)) s-=30; else s-=70; }
  624. X
  625. X    s = 2330;
  626. X    for(j=288; j<336; j++)
  627. X    { start[j] = s; leng[j] = 210; if(0==(j%2)) s-=30; else s-=70; }
  628. X
  629. X    s = 2330;
  630. X    for(j=336; j<384; j++)
  631. X    { start[j] = s; leng[j] = 240; if(0==(j%2)) s-=30; else s-=70; }
  632. X
  633. X    s = 2330;
  634. X    for(j=384; j<432; j++)
  635. X    { start[j] = s; leng[j] = 270; if(0==(j%2)) s-=30; else s-=70; }
  636. X
  637. X    s = 2330;
  638. X    for(j=432; j<480; j++)
  639. X    { start[j] = s; leng[j] = 300; if(0==(j%2)) s-=30; else s-=70; }
  640. X
  641. X    } /* end of initializer block */
  642. X
  643. X
  644. X
  645. X    if((i >= 480) || (i < 0))
  646. X        printf("\nPANIC, Illegal table index %d\n", i);
  647. X
  648. X    fflush(stdout);
  649. X    *outtime = (start[i]) ;
  650. X    *outdur = (leng[i]) ;
  651. X
  652. X    if( (*outtime == INVALID) || (*outdur == INVALID) )
  653. X    {
  654. X        printf("oops, I dont have an entry for index %d\n", i);
  655. X        fflush(stdout);
  656. X        *outtime = 0;
  657. X        *outdur = 0;
  658. X    }
  659. }
  660. X
  661. X
  662. X
  663. X
  664. X
  665. X
  666. void    bit_shuffle(t8c5, t2c1, tval, cval)
  667. X    int    t8c5, t2c1;
  668. X    int    *tval, *cval ;
  669. {
  670. X    int    tt, cc, b;
  671. X
  672. X    tt = 0 ;
  673. X    cc = 0 ;
  674. X
  675. X    /* get t8 thru t3 */
  676. X    b = 0x00000001 & (t8c5 >> 9) ;
  677. X    tt += (b << 8);
  678. X
  679. X    b = 0x00000001 & (t8c5 >> 7) ;
  680. X    tt += (b << 7);
  681. X
  682. X    b = 0x00000001 & (t8c5 >> 5) ;
  683. X    tt += (b << 6);
  684. X
  685. X    b = 0x00000001 & (t8c5 >> 4) ;
  686. X    tt += (b << 5);
  687. X
  688. X    b = 0x00000001 & (t8c5 >> 3) ;
  689. X    tt += (b << 4);
  690. X
  691. X    b = 0x00000001 & t8c5 ;
  692. X    tt += (b << 3);
  693. X
  694. X
  695. X    /* get c5 thru c2 */
  696. X    b = 0x00000001 & (t8c5 >> 8) ;
  697. X    cc += (b << 5);
  698. X
  699. X    b = 0x00000001 & (t8c5 >> 6) ;
  700. X    cc += (b << 4);
  701. X
  702. X    b = 0x00000001 & (t8c5 >> 2) ;
  703. X    cc += (b << 3);
  704. X
  705. X    b = 0x00000001 & (t8c5 >> 1) ;
  706. X    cc += (b << 2) ;
  707. X
  708. X
  709. X    /* get t2 thru t0 */
  710. X    b = 0x00000001 & (t2c1 >> 4) ;
  711. X    tt += (b << 2);
  712. X
  713. X    b = 0x00000001 & (t2c1 >> 2) ;
  714. X    tt += (b << 1);
  715. X
  716. X    b = 0x00000001 & t2c1 ;
  717. X    tt += b;
  718. X
  719. X
  720. X    /* get c1 thru c0 */
  721. X    b = 0x00000001 & (t2c1 >> 3) ;
  722. X    cc += (b << 1);
  723. X
  724. X    b = 0x00000001 & (t2c1 >> 1) ;
  725. X    cc += b ;
  726. X
  727. X    *tval = tt;
  728. X    *cval = cc;
  729. }
  730. X
  731. X
  732. X
  733. X
  734. X
  735. int    map_top(day, year, top, digits)
  736. X    int    day, year, top, digits ;
  737. {
  738. X    int    d2, d1, d0, y, poot ;
  739. X    int    n2, n1, n0, f3, f2, f1, f0;
  740. X
  741. X    y = year % 16 ;
  742. X    d2 = top / 100 ;
  743. X    d1 = (top % 100) / 10 ;
  744. X    d0 = top % 10 ;
  745. X
  746. X    f0 = 1;
  747. X    f1 = (y + 1) % 10;
  748. X    f2 = ( ((y+1)*(y+2)) / 2 ) % 10 ;
  749. X    f3 = ( ((y+1)*(y+2)*(y+3)) / 6 ) % 10 ;
  750. X
  751. X
  752. X    if(digits == 1)
  753. X    {
  754. X        n0 = ( (d0*f0) + (day*f1) ) % 10 ;
  755. X        n1 = 0;
  756. X        n2 = 0;
  757. X    }
  758. X
  759. X    if(digits == 2)
  760. X    {
  761. X        n0 = ( (d0*f0) + (d1*f1) + (day*f2) ) % 10 ;
  762. X        n1 = ( (d1*f0) + (day*f1) ) % 10 ;
  763. X        n2 = 0;
  764. X    }
  765. X
  766. X    if(digits == 3)
  767. X    {
  768. X        n0 = ( (d0*f0) + (d1*f1) + (d2*f2) + (day*f3) ) % 10 ;
  769. X        n1 = ( (d1*f0) + (d2*f1) + (day*f2) ) % 10 ;
  770. X        n2 = ( (d2*f0) + (day*f1) ) % 10 ;
  771. X    }
  772. X
  773. X
  774. X    poot =  (100*n2) + (10*n1) + n0 ;
  775. X
  776. X    return( poot );
  777. }
  778. X
  779. X
  780. X
  781. X
  782. X
  783. void    offset(day, year, top, ofout, topout)
  784. X    int    day, year, top ;
  785. X    int    *ofout, *topout ;
  786. {
  787. X    int    i, t, tx, off, digits, burp;
  788. X    int    pwr ;
  789. X
  790. X    pwr = 1 ; digits = 0;
  791. X    while(top >= pwr) { digits++; pwr *= 10; }
  792. X    pwr = pwr / 10 ;
  793. X
  794. X    t = tx = top ;
  795. X    off = 0;
  796. X    while(tx > 0) { off += (tx % 10);   tx /= 10; }
  797. X
  798. again:
  799. X    for(i=0; i<=(year%16); i++)
  800. X        {
  801. X        burp = ( (map_top(day, i, t, digits)) % 10 ) ;
  802. X        off += burp ;
  803. X        }
  804. X
  805. X    t = map_top(day, year, t, digits) ;
  806. X    if(t < pwr) goto again ;
  807. X
  808. X
  809. X    *ofout = (off % 32) ;
  810. X    *topout = (t) ;
  811. }
  812. X
  813. X
  814. X
  815. X
  816. X
  817. X
  818. X
  819. X
  820. X
  821. X
  822. main(argc, argv)
  823. X    int    argc;
  824. X    char    *argv[];
  825. {
  826. X    int    newspaper ;
  827. X    int    s1_out, bot3, top5, quo, rem ;
  828. X    int    s5_out, mtout, ofout, tval, cval ;
  829. X    int    date_today, month_today, year_today ;
  830. X    int    day_out, channel_out;
  831. X    int    starttime_out, duration_out ;
  832. X
  833. X
  834. X
  835. X    if(argc == 5) goto clean;
  836. X
  837. upchuck:
  838. X    printf("Usage: %s  todays_month  todays_day  todays_year   Code_value_in_newspaper\n",
  839. X        argv[0]);
  840. X    exit(-1) ;
  841. X
  842. X
  843. X
  844. clean:
  845. X
  846. X    month_today = atoi(argv[1]);
  847. X    date_today = atoi(argv[2]);
  848. X    year_today = atoi(argv[3]);
  849. X    newspaper = atoi(argv[4]);
  850. X
  851. X    year_today = year_today % 100 ;
  852. X
  853. X
  854. X    if( (month_today>12) || (month_today<1) || (date_today<1) || (date_today>31) )
  855. X    { printf("Invalid date\n"); goto upchuck; }
  856. X
  857. X    if((newspaper < 1) || (newspaper > 999999))
  858. X    { printf("Sorry, I cant process that code value\n  I can only do codes with 6 digits or fewer\n"); goto upchuck; }
  859. X
  860. X
  861. X
  862. X
  863. X    ofout = INVALID ;
  864. X    mtout = INVALID ;
  865. X
  866. X    s1_out = f1(newspaper); 
  867. X    bot3 = s1_out % 1000;
  868. X    top5 = s1_out / 1000;
  869. X    quo = (bot3 - 1) / 32 ;
  870. X    rem = (bot3 - 1) % 32 ;
  871. X    day_out = quo + 1;
  872. X
  873. X    if(newspaper >= 1000)
  874. X        offset(day_out, year_today, top5, (&ofout), (&mtout)) ;
  875. X    else { mtout = 0; ofout = 0; }
  876. X
  877. X    s5_out = (rem + (day_out*(month_today+1)) + ofout) % 32 ;
  878. X
  879. X
  880. X    bit_shuffle(mtout, s5_out, &tval, &cval);
  881. X    channel_out = cval + 1;
  882. X    lookup(tval, (&starttime_out), (&duration_out));
  883. X
  884. X    printf("Code= %6d    %2d  %2d  %2d   Mapped_channel= %2d  Start_time= %4d  Length= %3d\n",
  885. X        newspaper, month_today, day_out, year_today, channel_out, starttime_out, duration_out);
  886. X
  887. }
  888. SHAR_EOF
  889. chmod 0400 decode.c ||
  890. echo 'restore of decode.c failed'
  891. Wc_c="`wc -c < 'decode.c'`"
  892. test 13721 -eq "$Wc_c" ||
  893.     echo 'decode.c: original size 13721, current size' "$Wc_c"
  894. fi
  895. # ============= encode.c ==============
  896. if test -f 'encode.c' -a X"$1" != X"-c"; then
  897.     echo 'x - skipping encode.c (File already exists)'
  898. else
  899. echo 'x - extracting encode.c (Text)'
  900. sed 's/^X//' << 'SHAR_EOF' > 'encode.c' &&
  901. #include <stdio.h>
  902. X
  903. #define        KEY001    (9371)
  904. #define        INVALID    (-987)
  905. X
  906. X
  907. /* function that performs initial scrambling */
  908. int    mixup(x, y)
  909. X    int    x, y;
  910. {
  911. X    int    i, j, k, sum;
  912. X
  913. X    int    a[12], b[12], out[12] ;
  914. X
  915. X    /* get the digits of x into a[] */
  916. X    j = x ;
  917. X    for(i=0; i<9; i++)
  918. X    {
  919. X        k = j % 10;
  920. X        a[i] = k;
  921. X        j = (j - k) / 10 ;
  922. X    }
  923. X
  924. X    /* get the digits of y into b[] */
  925. X    j = y ;
  926. X    for(i=0; i<9; i++)
  927. X    {
  928. X        k = j % 10;
  929. X        b[i] = k;
  930. X        j = (j - k) / 10 ;
  931. X        out[i] = 0;
  932. X    }
  933. X
  934. X
  935. X    for(i=0; i<=8; i++)
  936. X    {
  937. X        for(j=0; j<=8; j++)
  938. X        {
  939. X            out[i+j] += (b[j] * a[i]) ;
  940. X        }
  941. X    }
  942. X
  943. X    j = 1;
  944. X    sum = 0;
  945. X    for(i=0; i<=8; i++)
  946. X    {
  947. X        sum += j * (out[i] % 10);
  948. X        j = j * 10 ;
  949. X    }
  950. X    return( sum ) ;
  951. }
  952. X
  953. X
  954. X
  955. /* first function */
  956. int    f1(inval)
  957. X    int    inval ;
  958. {
  959. X    int    ndigits, hashval ;
  960. X    int    pwr ;
  961. X
  962. X
  963. X    ndigits = 0;
  964. X    pwr = 1;
  965. X    while(inval >= pwr) { ndigits++; pwr *= 10; }
  966. X    if(ndigits > 8) printf("\nPANIC: %d has %d digits\n", inval, ndigits);
  967. X    pwr = pwr / 10 ;
  968. X
  969. X    hashval = inval;
  970. again:    hashval = mixup(hashval, KEY001) % (pwr * 10) ;
  971. X    if(hashval < pwr) goto again ;
  972. X
  973. X    return(hashval);
  974. }
  975. X
  976. X
  977. X
  978. X
  979. /* the 512-entry tables of starting time and pgm duration */
  980. int    lookup(stime, durat)
  981. X    int    stime, durat ;
  982. {
  983. X    static    int    start[480], leng[480] ;
  984. X    static    int    initializer = 0;
  985. X
  986. X    int    s, j;
  987. X
  988. X    if(initializer == 0) {
  989. X    initializer = 1;
  990. X
  991. X    for(j=0; j<512; j++) { start[j] = leng[j] = INVALID; }
  992. X
  993. X    leng[0]   =  30 ;
  994. X    leng[100] = 120 ;
  995. X    leng[101] =  90 ;
  996. X    leng[102] = 120 ;
  997. X    leng[103] = 120 ;
  998. X    leng[104] =  90 ;
  999. X    leng[105] =  90 ;
  1000. X    leng[106] =  30 ;
  1001. X    leng[107] =  30 ;
  1002. X    leng[108] = 120 ;
  1003. X    leng[109] =  90 ;
  1004. X    leng[10]  =  30 ;
  1005. X    leng[110] =  90 ;
  1006. X    leng[111] =  30 ;
  1007. X    leng[112] =  90 ;
  1008. X    leng[113] =  30 ;
  1009. X    leng[114] =  30 ;
  1010. X    leng[115] = 120 ;
  1011. X    leng[116] =  30 ;
  1012. X    leng[117] = 120 ;
  1013. X    leng[118] = 120 ;
  1014. X    leng[119] =  30 ;
  1015. X    leng[11]  =  30 ;
  1016. X    leng[120] =  90 ;
  1017. X    leng[121] =  60 ;
  1018. X    leng[122] =  60 ;
  1019. X    leng[123] =  60 ;
  1020. X    leng[124] = 120 ;
  1021. X    leng[125] =  90 ;
  1022. X    leng[126] =  60 ;
  1023. X    leng[127] =  60 ;
  1024. X    leng[128] =  90 ;
  1025. X    leng[129] = 120 ;
  1026. X    leng[12]  =  30 ;
  1027. X    leng[130] = 120 ;
  1028. X    leng[131] =  90 ;
  1029. X    leng[132] =  60 ;
  1030. X    leng[133] =  60 ;
  1031. X    leng[134] = 120 ;
  1032. X    leng[135] =  90 ;
  1033. X    leng[136] =  90 ;
  1034. X    leng[137] = 120 ;
  1035. X    leng[138] = 120 ;
  1036. X    leng[139] =  60 ;
  1037. X    leng[13]  = 120 ;
  1038. X    leng[140] =  60 ;
  1039. X    leng[141] =  90 ;
  1040. X    leng[142] =  90 ;
  1041. X    leng[143] = 120 ;
  1042. X    leng[144] =  90 ;
  1043. X    leng[145] = 120 ;
  1044. X    leng[146] =  90 ;
  1045. X    leng[147] = 120 ;
  1046. X    leng[148] = 120 ;
  1047. X    leng[149] =  90 ;
  1048. X    leng[14]  =  30 ;
  1049. X    leng[150] = 120 ;
  1050. X    leng[151] =  90 ;
  1051. X    leng[152] =  90 ;
  1052. X    leng[153] =  90 ;
  1053. X    leng[154] =  60 ;
  1054. X    leng[155] =  60 ;
  1055. X    leng[156] = 120 ;
  1056. X    leng[157] =  60 ;
  1057. X    leng[158] =  60 ;
  1058. X    leng[159] =  60 ;
  1059. X    leng[15]  =  30 ;
  1060. X    leng[160] = 120 ;
  1061. X    leng[161] =  60 ;
  1062. X    leng[162] =  90 ;
  1063. X    leng[163] =  90 ;
  1064. X    leng[164] =  60 ;
  1065. X    leng[165] =  90 ;
  1066. X    leng[166] =  90 ;
  1067. X    leng[167] =  60 ;
  1068. X    leng[168] =  90 ;
  1069. X    leng[169] = 120 ;
  1070. X    leng[16]  = 120 ;
  1071. X    leng[170] =  60 ;
  1072. X    leng[171] = 120 ;
  1073. X    leng[172] =  60 ;
  1074. X    leng[173] =  60 ;
  1075. X    leng[174] = 120 ;
  1076. X    leng[175] =  90 ;
  1077. X    leng[176] =  60 ;
  1078. X    leng[177] = 120 ;
  1079. X    leng[178] =  60 ;
  1080. X    leng[179] =  60 ;
  1081. X    leng[17]  = 120 ;
  1082. X    leng[180] =  60 ;
  1083. X    leng[181] =  90 ;
  1084. X    leng[182] =  60 ;
  1085. X    leng[183] = 120 ;
  1086. X    leng[184] =  60 ;
  1087. X    leng[185] =  60 ;
  1088. X    leng[186] =  90 ;
  1089. X    leng[187] =  60 ;
  1090. X    leng[188] =  90 ;
  1091. X    leng[189] = 120 ;
  1092. X    leng[18]  =  60 ;
  1093. X    leng[190] =  90 ;
  1094. X    leng[191] =  90 ;
  1095. X    leng[19]  = 120 ;
  1096. X    leng[1]   =  30 ;
  1097. X    leng[20]  =  60 ;
  1098. X    leng[21]  =  60 ;
  1099. X    leng[22]  =  60 ;
  1100. X    leng[23]  = 120 ;
  1101. X    leng[24]  =  60 ;
  1102. X    leng[25]  = 120 ;
  1103. X    leng[26]  =  30 ;
  1104. X    leng[27]  =  30 ;
  1105. X    leng[28]  =  30 ;
  1106. X    leng[29]  =  60 ;
  1107. X    leng[2]   =  30 ;
  1108. X    leng[30]  =  90 ;
  1109. X    leng[31]  =  30 ;
  1110. X    leng[32]  =  30 ;
  1111. X    leng[33]  =  30 ;
  1112. X    leng[34]  =  30 ;
  1113. X    leng[35]  =  60 ;
  1114. X    leng[36]  =  30 ;
  1115. X    leng[37]  =  60 ;
  1116. X    leng[38]  = 120 ;
  1117. X    leng[39]  =  60 ;
  1118. X    leng[3]   =  30 ;
  1119. X    leng[40]  =  30 ;
  1120. X    leng[41]  =  30 ;
  1121. X    leng[42]  =  30 ;
  1122. X    leng[43]  =  30 ;
  1123. X    leng[44]  = 120 ;
  1124. X    leng[45]  =  30 ;
  1125. X    leng[46]  =  30 ;
  1126. X    leng[47]  =  30 ;
  1127. X    leng[48]  = 120 ;
  1128. X    leng[49]  =  30 ;
  1129. X    leng[4]   =  30 ;
  1130. X    leng[50]  =  60 ;
  1131. X    leng[51]  =  60 ;
  1132. X    leng[52]  =  30 ;
  1133. X    leng[53]  =  30 ;
  1134. X    leng[54]  = 120 ;
  1135. X    leng[55]  =  60 ;
  1136. X    leng[56]  =  60 ;
  1137. X    leng[57]  =  30 ;
  1138. X    leng[58]  = 120 ;
  1139. X    leng[59]  =  30 ;
  1140. X    leng[5]   =  30 ;
  1141. X    leng[60]  = 120 ;
  1142. X    leng[61]  = 120 ;
  1143. X    leng[62]  = 120 ;
  1144. X    leng[63]  =  30 ;
  1145. X    leng[64]  =  90 ;
  1146. X    leng[65]  =  30 ;
  1147. X    leng[66]  =  30 ;
  1148. X    leng[67]  =  30 ;
  1149. X    leng[68]  = 120 ;
  1150. X    leng[69]  =  90 ;
  1151. X    leng[6]   =  30 ;
  1152. X    leng[70]  =  90 ;
  1153. X    leng[71]  =  60 ;
  1154. X    leng[72]  =  90 ;
  1155. X    leng[73]  =  90 ;
  1156. X    leng[74]  =  90 ;
  1157. X    leng[75]  =  90 ;
  1158. X    leng[76]  =  90 ;
  1159. X    leng[77]  =  60 ;
  1160. X    leng[78]  =  90 ;
  1161. X    leng[79]  =  30 ;
  1162. X    leng[7]   =  30 ;
  1163. X    leng[80]  = 120 ;
  1164. X    leng[81]  =  60 ;
  1165. X    leng[82]  =  90 ;
  1166. X    leng[83]  = 120 ;
  1167. X    leng[84]  =  60 ;
  1168. X    leng[85]  =  60 ;
  1169. X    leng[86]  = 120 ;
  1170. X    leng[87]  =  30 ;
  1171. X    leng[88]  =  90 ;
  1172. X    leng[89]  = 120 ;
  1173. X    leng[8]   =  30 ;
  1174. X    leng[90]  = 120 ;
  1175. X    leng[91]  =  90 ;
  1176. X    leng[92]  =  90 ;
  1177. X    leng[93]  =  90 ;
  1178. X    leng[94]  =  90 ;
  1179. X    leng[95]  = 120 ;
  1180. X    leng[96]  =  60 ;
  1181. X    leng[97]  = 120 ;
  1182. X    leng[98]  =  90 ;
  1183. X    leng[99]  =  30 ;
  1184. X    leng[9]   =  60 ;
  1185. X    start[0]   = 1830 ;
  1186. X    start[100] =  330 ;
  1187. X    start[101] = 1500 ;
  1188. X    start[102] = 1500 ;
  1189. X    start[103] = 2300 ;
  1190. X    start[104] = 1900 ;
  1191. X    start[105] =  800 ;
  1192. X    start[106] =  430 ;
  1193. X    start[107] =  300 ;
  1194. X    start[108] = 1330 ;
  1195. X    start[109] = 1000 ;
  1196. X    start[10]  = 1400 ;
  1197. X    start[110] =  700 ;
  1198. X    start[111] =  100 ;
  1199. X    start[112] = 2330 ;
  1200. X    start[113] =  330 ;
  1201. X    start[114] =  200 ;
  1202. X    start[115] = 2230 ;
  1203. X    start[116] =  400 ;
  1204. X    start[117] =  600 ;
  1205. X    start[118] =  400 ;
  1206. X    start[119] =  230 ;
  1207. X    start[11]  = 2030 ;
  1208. X    start[120] =  630 ;
  1209. X    start[121] =   30 ;
  1210. X    start[122] = 2230 ;
  1211. X    start[123] =  100 ;
  1212. X    start[124] =   30 ;
  1213. X    start[125] = 2300 ;
  1214. X    start[126] = 1630 ;
  1215. X    start[127] =  830 ;
  1216. X    start[128] =    0 ;
  1217. X    start[129] = 1930 ;
  1218. X    start[12]  = 1700 ;
  1219. X    start[130] =  930 ;
  1220. X    start[131] = 2030 ;
  1221. X    start[132] =  500 ;
  1222. X    start[133] = 1730 ;
  1223. X    start[134] =  200 ;
  1224. X    start[135] = 1930 ;
  1225. X    start[136] =  930 ;
  1226. X    start[137] = 1730 ;
  1227. X    start[138] =  630 ;
  1228. X    start[139] = 1830 ;
  1229. X    start[13]  = 1600 ;
  1230. X    start[140] = 1430 ;
  1231. X    start[141] = 1130 ;
  1232. X    start[142] =   30 ;
  1233. X    start[143] =  830 ;
  1234. X    start[144] = 1030 ;
  1235. X    start[145] = 1430 ;
  1236. X    start[146] =  100 ;
  1237. X    start[147] =  730 ;
  1238. X    start[148] = 2030 ;
  1239. X    start[149] =  300 ;
  1240. X    start[14]  = 2000 ;
  1241. X    start[150] =  300 ;
  1242. X    start[151] = 1330 ;
  1243. X    start[152] = 1230 ;
  1244. X    start[153] =  230 ;
  1245. X    start[154] = 2130 ;
  1246. X    start[155] = 1130 ;
  1247. X    start[156] = 1830 ;
  1248. X    start[157] =  630 ;
  1249. X    start[158] =  530 ;
  1250. X    start[159] =  200 ;
  1251. X    start[15]  = 1500 ;
  1252. X    start[160] = 1530 ;
  1253. X    start[161] =  730 ;
  1254. X    start[162] =  600 ;
  1255. X    start[163] = 1730 ;
  1256. X    start[164] =  400 ;
  1257. X    start[165] =  730 ;
  1258. X    start[166] =  430 ;
  1259. X    start[167] =  430 ;
  1260. X    start[168] =  130 ;
  1261. X    start[169] = 1230 ;
  1262. X    start[16]  = 2000 ;
  1263. X    start[170] =  130 ;
  1264. X    start[171] =  230 ;
  1265. X    start[172] = 1930 ;
  1266. X    start[173] =  300 ;
  1267. X    start[174] = 1030 ;
  1268. X    start[175] =  200 ;
  1269. X    start[176] =  330 ;
  1270. X    start[177] =  500 ;
  1271. X    start[178] =  930 ;
  1272. X    start[179] =  230 ;
  1273. X    start[17]  = 2100 ;
  1274. X    start[180] = 2030 ;
  1275. X    start[181] =  400 ;
  1276. X    start[182] = 1530 ;
  1277. X    start[183] =  430 ;
  1278. X    start[184] = 1330 ;
  1279. X    start[185] = 1230 ;
  1280. X    start[186] =  330 ;
  1281. X    start[187] = 1030 ;
  1282. X    start[188] =  500 ;
  1283. X    start[189] =  530 ;
  1284. X    start[18]  = 2000 ;
  1285. X    start[190] =  530 ;
  1286. X    start[191] = 1100 ;
  1287. X    start[19]  = 1800 ;
  1288. X    start[1]   = 1600 ;
  1289. X    start[20]  = 1900 ;
  1290. X    start[21]  = 2200 ;
  1291. X    start[22]  = 2100 ;
  1292. X    start[23]  = 1400 ;
  1293. X    start[24]  = 1500 ;
  1294. X    start[25]  = 2200 ;
  1295. X    start[26]  = 1130 ;
  1296. X    start[27]  = 1100 ;
  1297. X    start[28]  = 2300 ;
  1298. X    start[29]  = 1600 ;
  1299. X    start[2]   = 1930 ;
  1300. X    start[30]  = 2100 ;
  1301. X    start[31]  = 2100 ;
  1302. X    start[32]  = 1230 ;
  1303. X    start[33]  = 1330 ;
  1304. X    start[34]  =  930 ;
  1305. X    start[35]  = 1300 ;
  1306. X    start[36]  = 2130 ;
  1307. X    start[37]  = 1200 ;
  1308. X    start[38]  = 1000 ;
  1309. X    start[39]  = 1800 ;
  1310. X    start[3]   = 1630 ;
  1311. X    start[40]  = 2200 ;
  1312. X    start[41]  = 1200 ;
  1313. X    start[42]  =  800 ;
  1314. X    start[43]  =  830 ;
  1315. X    start[44]  = 1700 ;
  1316. X    start[45]  =  900 ;
  1317. X    start[46]  = 2230 ;
  1318. X    start[47]  = 1030 ;
  1319. X    start[48]  = 1900 ;
  1320. X    start[49]  =  730 ;
  1321. X    start[4]   = 1530 ;
  1322. X    start[50]  = 2300 ;
  1323. X    start[51]  = 1000 ;
  1324. X    start[52]  =  700 ;
  1325. X    start[53]  = 1300 ;
  1326. X    start[54]  =  700 ;
  1327. X    start[55]  = 1100 ;
  1328. X    start[56]  = 1400 ;
  1329. X    start[57]  = 1000 ;
  1330. X    start[58]  =  800 ;
  1331. X    start[59]  = 2330 ;
  1332. X    start[5]   = 1730 ;
  1333. X    start[60]  = 1300 ;
  1334. X    start[61]  = 1200 ;
  1335. X    start[62]  =  900 ;
  1336. X    start[63]  =  630 ;
  1337. X    start[64]  = 1800 ;
  1338. X    start[65]  =  600 ;
  1339. X    start[66]  =  530 ;
  1340. X    start[67]  =    0 ;
  1341. X    start[68]  = 2330 ;
  1342. X    start[69]  = 2200 ;
  1343. X    start[6]   = 1800 ;
  1344. X    start[70]  = 1300 ;
  1345. X    start[71]  =  900 ;
  1346. X    start[72]  = 1630 ;
  1347. X    start[73]  = 1600 ;
  1348. X    start[74]  = 1430 ;
  1349. X    start[75]  = 2000 ;
  1350. X    start[76]  = 1830 ;
  1351. X    start[77]  =  600 ;
  1352. X    start[78]  = 1200 ;
  1353. X    start[79]  =   30 ;
  1354. X    start[7]   = 1430 ;
  1355. X    start[80]  =  130 ;
  1356. X    start[81]  =    0 ;
  1357. X    start[82]  = 1700 ;
  1358. X    start[83]  =    0 ;
  1359. X    start[84]  =  800 ;
  1360. X    start[85]  =  700 ;
  1361. X    start[86]  = 2130 ;
  1362. X    start[87]  =  500 ;
  1363. X    start[88]  = 1530 ;
  1364. X    start[89]  = 1130 ;
  1365. X    start[8]   = 1900 ;
  1366. X    start[90]  = 1100 ;
  1367. X    start[91]  =  830 ;
  1368. X    start[92]  = 2230 ;
  1369. X    start[93]  =  900 ;
  1370. X    start[94]  = 2130 ;
  1371. X    start[95]  = 1630 ;
  1372. X    start[96]  = 2330 ;
  1373. X    start[97]  =  100 ;
  1374. X    start[98]  = 1400 ;
  1375. X    start[99]  =  130 ;
  1376. X    start[9]   = 1700 ;
  1377. X
  1378. X
  1379. X    s = 2330;
  1380. X    for(j=192; j<240; j++)
  1381. X    { start[j] = s; leng[j] = 150; if(0==(j%2)) s-=30; else s-=70; }
  1382. X
  1383. X    s = 2330;
  1384. X    for(j=240; j<288; j++)
  1385. X    { start[j] = s; leng[j] = 180; if(0==(j%2)) s-=30; else s-=70; }
  1386. X
  1387. X    s = 2330;
  1388. X    for(j=288; j<336; j++)
  1389. X    { start[j] = s; leng[j] = 210; if(0==(j%2)) s-=30; else s-=70; }
  1390. X
  1391. X    s = 2330;
  1392. X    for(j=336; j<384; j++)
  1393. X    { start[j] = s; leng[j] = 240; if(0==(j%2)) s-=30; else s-=70; }
  1394. X
  1395. X    s = 2330;
  1396. X    for(j=384; j<432; j++)
  1397. X    { start[j] = s; leng[j] = 270; if(0==(j%2)) s-=30; else s-=70; }
  1398. X
  1399. X    s = 2330;
  1400. X    for(j=432; j<480; j++)
  1401. X    { start[j] = s; leng[j] = 300; if(0==(j%2)) s-=30; else s-=70; }
  1402. X
  1403. X    } /* end of initializer block */
  1404. X
  1405. X
  1406. X    for(j=0; j<481; j++)
  1407. X    {
  1408. X        if(stime == start[j]) {
  1409. X            if(durat == leng[j]) break ;
  1410. X            }
  1411. X    }
  1412. X
  1413. X    if( j >= 480 )
  1414. X    {
  1415. X        printf("oops, I dont have an entry for index %d\n", j);
  1416. X        fflush(stdout);
  1417. X        j = 0;
  1418. X    }
  1419. X
  1420. X    return(j);
  1421. }
  1422. X
  1423. X
  1424. X
  1425. X
  1426. X
  1427. X
  1428. void    interleave(tblidx, cval, t8c5, t2c1)
  1429. X    int    tblidx, cval ;
  1430. X    int    *t8c5, *t2c1;
  1431. {
  1432. X    int    small, big, b;
  1433. X
  1434. X    small = 0;
  1435. X    big = 0;
  1436. X
  1437. X    /* build t2c1 */
  1438. X    b = 0x00000001 & (tblidx >> 2) ;
  1439. X    small += (b << 4);
  1440. X
  1441. X    b = 0x00000001 & (tblidx >> 1) ;
  1442. X    small += (b << 2);
  1443. X
  1444. X    b = 0x00000001 & tblidx ;
  1445. X    small += b;
  1446. X
  1447. X    b = 0x00000001 & (cval >> 1) ;
  1448. X    small += (b << 3);
  1449. X
  1450. X    b = 0x00000001 & cval ;
  1451. X    small += (b << 1);
  1452. X
  1453. X
  1454. X    /* build t8c5 */
  1455. X    b = 0x00000001 & (tblidx >> 8) ;
  1456. X    big += (b << 9);
  1457. X
  1458. X    b = 0x00000001 & (tblidx >> 7) ;
  1459. X    big += (b << 7);
  1460. X
  1461. X    b = 0x00000001 & (tblidx >> 6) ;
  1462. X    big += (b << 5);
  1463. X
  1464. X    b = 0x00000001 & (tblidx >> 5) ;
  1465. X    big += (b << 4);
  1466. X
  1467. X    b = 0x00000001 & (tblidx >> 4) ;
  1468. X    big += (b << 3);
  1469. X
  1470. X    b = 0x00000001 & (tblidx >> 3) ;
  1471. X    big += b;
  1472. X
  1473. X    b = 0x00000001 & (cval >> 5) ;
  1474. X    big += (b << 8);
  1475. X
  1476. X    b = 0x00000001 & (cval >> 4) ;
  1477. X    big += (b << 6);
  1478. X
  1479. X    b = 0x00000001 & (cval >> 3) ;
  1480. X    big += (b << 2);
  1481. X
  1482. X    b = 0x00000001 & (cval >> 2) ;
  1483. X    big += (b << 1);
  1484. X
  1485. X
  1486. X    *t8c5 = big;
  1487. X    *t2c1 = small;
  1488. }
  1489. X
  1490. X
  1491. X
  1492. X
  1493. X
  1494. int    map_top(day, year, top, digits)
  1495. X    int    day, year, top, digits ;
  1496. {
  1497. X    int    d2, d1, d0, y, poot ;
  1498. X    int    n2, n1, n0, f3, f2, f1, f0;
  1499. X
  1500. X    y = year % 16 ;
  1501. X    d2 = top / 100 ;
  1502. X    d1 = (top % 100) / 10 ;
  1503. X    d0 = top % 10 ;
  1504. X
  1505. X    f0 = 1;
  1506. X    f1 = (y + 1) % 10;
  1507. X    f2 = ( ((y+1)*(y+2)) / 2 ) % 10 ;
  1508. X    f3 = ( ((y+1)*(y+2)*(y+3)) / 6 ) % 10 ;
  1509. X
  1510. X
  1511. X    if(digits == 1)
  1512. X    {
  1513. X        n0 = ( (d0*f0) + (day*f1) ) % 10 ;
  1514. X        n1 = 0;
  1515. X        n2 = 0;
  1516. X    }
  1517. X
  1518. X    if(digits == 2)
  1519. X    {
  1520. X        n0 = ( (d0*f0) + (d1*f1) + (day*f2) ) % 10 ;
  1521. X        n1 = ( (d1*f0) + (day*f1) ) % 10 ;
  1522. X        n2 = 0;
  1523. X    }
  1524. X
  1525. X    if(digits == 3)
  1526. X    {
  1527. X        n0 = ( (d0*f0) + (d1*f1) + (d2*f2) + (day*f3) ) % 10 ;
  1528. X        n1 = ( (d1*f0) + (d2*f1) + (day*f2) ) % 10 ;
  1529. X        n2 = ( (d2*f0) + (day*f1) ) % 10 ;
  1530. X    }
  1531. X
  1532. X
  1533. X    poot =  (100*n2) + (10*n1) + n0 ;
  1534. X
  1535. X    return( poot );
  1536. }
  1537. X
  1538. X
  1539. X
  1540. X
  1541. X
  1542. void    offset(day, year, top, ofout, topout)
  1543. X    int    day, year, top ;
  1544. X    int    *ofout, *topout ;
  1545. {
  1546. X    int    i, t, tx, off, digits, burp;
  1547. X    int    pwr ;
  1548. X
  1549. X
  1550. X    pwr = 1 ; digits = 0;
  1551. X    while(top >= pwr) { digits++; pwr *= 10; }
  1552. X    pwr = pwr / 10 ;
  1553. X
  1554. X    t = tx = top ;
  1555. X    off = 0;
  1556. X    while(tx > 0) { off += (tx % 10);   tx /= 10; }
  1557. X
  1558. again:
  1559. X    for(i=0; i<=(year%16); i++)
  1560. X        {
  1561. X        burp = ( (map_top(day, i, t, digits)) % 10 ) ;
  1562. X        off += burp ;
  1563. X        }
  1564. X
  1565. X    t = map_top(day, year, t, digits) ;
  1566. X    if(t < pwr) goto again ;
  1567. X
  1568. X
  1569. X    *ofout = (off % 32) ;
  1570. X    *topout = (t) ;
  1571. }
  1572. X
  1573. X
  1574. X
  1575. X
  1576. X
  1577. X
  1578. X
  1579. X
  1580. X
  1581. X
  1582. main(argc, argv)
  1583. X    int    argc;
  1584. X    char    *argv[];
  1585. {
  1586. X    int    j, doneflag, trailers, tblidx ;
  1587. X    int    s1_out, bot3, top5, quo, rem, newspaper ;
  1588. X    int    s4_out, s5_out, ofout, cval ;
  1589. X    int    month, day, year, channel, starttime, duration ;
  1590. X
  1591. X
  1592. X
  1593. X    if(argc == 7) goto clean;
  1594. X
  1595. upchuck:
  1596. X    printf("Usage: %s  month  day  year  channel  starting_time  length_in_minutes\n",
  1597. X        argv[0]);
  1598. X    exit(-1) ;
  1599. X
  1600. X
  1601. X
  1602. clean:
  1603. X
  1604. X    month = atoi(argv[1]);
  1605. X    day = atoi(argv[2]);
  1606. X    year = atoi(argv[3]);
  1607. X    channel = atoi(argv[4]);
  1608. X    starttime = atoi(argv[5]);
  1609. X    duration = atoi(argv[6]);
  1610. X
  1611. X    year = year % 100 ;
  1612. X
  1613. X    if( (month>12) || (month<1) || (day<1) || (day>31) )
  1614. X    { printf("Invalid date\n"); goto upchuck; }
  1615. X
  1616. X    if( (channel<1) || (channel>48) )
  1617. X    { printf("Invalid channel number\n"); goto upchuck; }
  1618. X
  1619. X    trailers = starttime % 100;
  1620. X    if((trailers != 0) && (trailers != 30))
  1621. X    { printf("Invalid start time\n"); goto upchuck; }
  1622. X
  1623. X    if((starttime < 0) || (starttime > 2330))
  1624. X    { printf("Sorry, I cant process that starting time\n"); goto upchuck; }
  1625. X
  1626. X    trailers = duration % 30;
  1627. X    if((trailers!=0) || (duration<30) || (duration>300))
  1628. X    { printf("Sorry, I cant process that program length\n"); goto upchuck; }
  1629. X
  1630. X
  1631. X    /* get the  t  bits and the  c  bits */
  1632. X    cval = channel - 1 ;
  1633. X    tblidx = lookup(starttime, duration);
  1634. X
  1635. X    /* from them infer what must have been step 4 & step 5 results */
  1636. X    interleave(tblidx, cval, (&s4_out), (&s5_out)) ;
  1637. X
  1638. X    /* find the smallest unmapped_top giving correct mapped_top */
  1639. X    top5 = 0;
  1640. X    doneflag = 0;
  1641. X
  1642. X    /* if the mapped_top is zero then top and offset are zero */
  1643. X    if(s4_out == 0) { top5 = 0; ofout = 0; doneflag = 1; }
  1644. X
  1645. X    while(doneflag == 0)
  1646. X    {
  1647. X        top5++;
  1648. X        offset(day, year, top5, (&ofout), (&j)) ;
  1649. X        if(j == s4_out) doneflag = 1;
  1650. X    }
  1651. X
  1652. X    /* have two of the three inputs to step 5; determine the rem */
  1653. X    for(rem=0; rem<32; rem++)
  1654. X    {
  1655. X        j = (rem + (day*(month+1)) + ofout) % 32 ;
  1656. X        if(j == s5_out) break ;
  1657. X    }
  1658. X    quo = (day - 1);
  1659. X
  1660. X
  1661. X    /* assemble the output of step 1 */
  1662. X    bot3 = 1 + rem + (32 * quo) ;
  1663. X    s1_out = bot3 + (1000 * top5) ;
  1664. X
  1665. X    /* invert the mixing */
  1666. X    newspaper = f1(s1_out);
  1667. X
  1668. X    printf(" %2d  %2d  %2d %3d  %4d  %3d    VCRPLUS_CODE= %8d\n",
  1669. X        month, day, year, channel, starttime, duration, newspaper);
  1670. X
  1671. }
  1672. SHAR_EOF
  1673. chmod 0400 encode.c ||
  1674. echo 'restore of encode.c failed'
  1675. Wc_c="`wc -c < 'encode.c'`"
  1676. test 14248 -eq "$Wc_c" ||
  1677.     echo 'encode.c: original size 14248, current size' "$Wc_c"
  1678. fi
  1679. exit 0
  1680.